home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / FMULDV.SA < prev    next >
Text File  |  1987-03-04  |  10KB  |  358 lines

  1.   TTL FLOATING-POINT MULTIPLY OPERATION
  2.   NAM  FMULDV
  3. *
  4. *      DEFINE EXTERNAL REFERENCES
  5. *
  6.   XDEF    FMUL,FDIV
  7. *
  8.   XREF    VALID,NORM1,GOSET,FPMOVE,DNORM1
  9.   XREF    FRCTAB,BITTBL,XADDY
  10. *
  11. *
  12. *    REVISION HISTORY:
  13. *      DATE        PROGRAMMER        REASON
  14. *
  15. *    23.MAY.80        G.WALKER        ORIGINAL
  16. *     1.JUL.80        G.WALKER        CODE COMPACTION
  17. *    13.JUL.80        G.WALKER        SPEED & SHRINK
  18. *    17.JUL.80        G.WALKER        MORE SHRINK BY JOEL
  19. *    14.AUG.80        G.WALKER        DISALLOW NORMAL ZERO AS RESULT
  20. *    06.OCT.80        G.WALKER        ALLOW CALC. WHEN RESULT IS ZERO
  21. *    14.OCT.80        G.WALKER        CALCULATE FULL RESULT PRECISION
  22. *    16.DEC.80        G.WALKER        CORRECT STICKY LOOP INDEX
  23. *
  24.   PAG
  25. ***********************************************************
  26. *
  27. *    FMUL --
  28. *       THIS SUBROUTINE MULTIPLIES ARG1 AND ARG2 FROM
  29. *    THE STACK FRAME, LEAVING THE PRODUCT IN RESULT.
  30. *
  31. *    THE RESULT SIGN IS THE EXCLUSIVE-OR OF THE SIGNS
  32. *    OF THE TWO ARGUMENTS. THE RESULT EXPONENT IS THE SUM
  33. *    OF THE TWO ARGUMENT EXPONENTS. (IT IS DECREMENTED BY
  34. *    ONE TO ADJUST THE RADIX POINT OF THE RESULT MANTISSA.)
  35. *    THE RESULT MANTISSA IS THE PRODUCT OF THE TWO
  36. *    ARGUMENT MANTISSAS CALCULATED TO FULL PRECISION AND THEN
  37. *    ROUNDED TO THE PRECISION OF THE ARGUMENTS.
  38. *
  39. *
  40. *    THE MULTIPLICATION ALGORITHM IS:
  41. *
  42. *    *****   STAY TUNED *******
  43. *
  44. *
  45. *    LOCAL STACK USAGE:      (OFFSET)
  46. *    COL (0): INDEX TO POSITION IN RESULT MANTISSA
  47. *     AI (1): INDEX TO BYTE IN ARG 1 MANTISSA TO BE MULTIPLIED
  48. *    MAXNDX (2): MAXIMUM INDEX INTO ARGUMENT PRECISION (SIGNIFICANT BYTE)
  49. *    TMPRSL (3): 21-BYTE TEMPORARY RESULT (CALC. EXACTLY)
  50. *
  51. *    REGISTER USAGE:
  52. *    D -- ARITHMETIC CALC. AND OFFSET INDEXING
  53. *    Y -- ADDR. OF BYTE IN ARG2
  54. *    X -- ADDR. OF BYTE IN ARG1
  55. *    U -- STACK FRAME POINTER AND INDEX INTO RESULT
  56. *    S -- STACK TOP POINTER
  57. *
  58. COL    SET 0
  59. AI     SET 1
  60. MAXNDX SET 2
  61. TMPRSL SET 3
  62. *
  63. *************
  64. *
  65. *     TABLE OF MAXIMUM INDEXES FOR ARGUMENT MANTISSAS
  66. *  OF THE GIVEN PRECISION.
  67. *
  68. NDXTAB    FCB    2      SINGLE
  69.     FCB    6      DOUBLE
  70.     FCB    7      EXTENDED
  71.     FCB    2      EXT. FORCED SINGLE
  72.     FCB    6      EXT. FORCED DOUBLE
  73. *
  74. FMUL EQU *
  75.   LEAS -24,S             RESERVE LOCAL STORAGE
  76.   LDA RPREC,U    GET MANT. SIZE INDEX
  77.   LSRA         DIVIDED BY 2
  78.   LEAX NDXTAB,PCR
  79.   LDB A,X    GET MAX. INDEX INTO MANTISSA FROM TABLE
  80.   STB MAXNDX,S      & SAVE ON STACK
  81. *
  82.   LDA ARG1,U  SIGN OF RESULT IS
  83.   EORA ARG2,U     EXOR OF ARG SIGNS
  84.   STA TMPRSL+SIGN,S
  85. *
  86.   LDD EXP1,U  EXP OF RESULT IS
  87.   ADDD EXP2,U    SUM OF ARG EXPS
  88.   ADDD #1
  89.   STD TMPRSL+EXP,S
  90. *
  91. *     CLEAR OUT TEMP. RESULT MANTISSA
  92. *
  93.   CLRA
  94.   CLRB
  95.   STD  TMPRSL+FRACT,S  CLEAR PARTIAL PRODUCT ACC.
  96.   STD  TMPRSL+FRACT+2,S
  97.   STD  TMPRSL+FRACT+4,S
  98.   STD  TMPRSL+FRACT+6,S
  99.   STD  TMPRSL+FRACT+8,S
  100.   STD  TMPRSL+FRACT+10,S
  101.   STD  TMPRSL+FRACT+12,S
  102.   STD  TMPRSL+FRACT+14,S
  103. *
  104. *    NOW MULTIPLY MANTISSAS TO FULL PRECISION, CREATING
  105. *  PARTIAL PRODUCTS IN EACH COLUMN FROM RIGHT TO LEFT.
  106.  
  107. *
  108.   LEAX FRACT1,U
  109.   LEAY FRACT2,U
  110. *
  111.   LDB  MAXNDX,S
  112.   ASLB             MAX INDEX TIMES 2
  113.   STB  COL,S           IS RIGHTMOST COLUMN
  114.   WHILE  B,GE,#0
  115.     LEAU TMPRSL+FRACT,S  ***  MUST RESTORE U ***
  116.     LEAU B,U         U-REG. POINTS TO COLUMN IN RESULT
  117.     LDA  MAXNDX,S
  118.     STA  AI,S         INDEX INTO ARG1
  119.     WHILE  A,GE,#0
  120.       LDB  COL,S      GET INDEX TO COLUMN OF RESULT
  121.       SUBB  AI,S     CREATE INDEX INTO ARG2
  122.       IF  B,LE,(MAXNDX,S)    IS IT WITHIN RANGE?
  123.     IF B,GE,#0
  124.       LDA  A,X     GET ARGUMENT BYTES AND MULTIPLY
  125.       LDB  B,Y
  126.       MUL
  127.       ADDD ,U       ADD PARTIAL PRODUCT INTO COLUMN
  128.       STD  ,U         OF THE TEMPORARY RESULT
  129.       IFCC CS
  130.         INC  -1,U          AND THROW CARRIES TO NEXT BYTE
  131.       ENDIF
  132.     ENDIF
  133.     DEC  AI,S     AND MOVE TO NEXT INDEX TO TEST ARG-BYTE PAIRS
  134.     LDA  AI,S
  135.       ELSE
  136.     LDA  #-1      TERMINATE LOOP IF MAX INDEX IS EXCEEDED
  137.     STA  AI,S
  138.       ENDIF
  139.     ENDWH         END LOOP TO CREATE INDEXES OF BYTE PAIRS
  140.     LDB  COL,S         NOW DO SAME FOR MEXT MOST SIGNIFICANT COLUMN
  141.     DECB
  142.     STB  COL,S
  143.   ENDWH          END LOOP FOR ALL COLUMNS
  144. *
  145. *
  146. *   NORMALIZE MANTISSA OF RESULT ONE BIT TO THE LEFT
  147. *     IF NEEDED.
  148. *
  149.   LEAU    -FRACT1,X    RESTORE STACK FRAME POINTER
  150.   LEAX    TMPRSL,S     POINT X TO RESULT
  151. *
  152.   LDA FRACT,X
  153.   IFCC GE    UNLESS MS-BIT IS A 1
  154.     LBSR  NORM1      NORMALIZE RESULT
  155.   ENDIF
  156. *
  157. *    ADJUST EXPONENT SO THAT A NORMAL ZERO
  158. *  WILL NOT SLIP BY, I.E. FORCE AN UNDERFLOW IN
  159. *  THE CASE THAT MULTIPLY PRODUCES A ZERO RESULT.
  160. *
  161.   LDD  EXP,X        IS RESULT EXPONENT MINIMUM?
  162.   IF   D,EQ,#$8000
  163.     LBSR  DNORM1    ADJUST SO IT IS'NT MINIMUM.
  164.   ENDIF
  165. *
  166. *    'OR' BYTES BELOW GUARD BYTE INTO STICKY BYTE.
  167. *
  168.   LEAX    FRACT,X     POINT TO TEMP. RSLT FRACTION
  169.   LDB  RPREC,U
  170.   LEAY GOSET,PCR
  171.   LSRB
  172.   LEAY B,Y        POINT Y TO INDEX OF GUARD BYTE
  173.   LDB  MAXNDX,S
  174.   ASLB            START OR'ING AT RIGHTMOST BYTE
  175.   INCB                WHICH IS ONE BEYOND 2*MAXNDX
  176.   CLRA               INITIAL SITCKY IS ZERO
  177.   WHILE  B,GT,(0,Y)
  178.     ORA  B,X
  179.     DECB
  180.   ENDWH
  181.   STA  STIKY,U
  182.   LEAX    -FRACT,X    POINT TO ENTIRE RESULT
  183. *
  184. *     COPY TEMPORARY RESULT ONTO STACK FRAME.
  185. *
  186.   LEAY    RESULT,U
  187.   LBSR    FPMOVE
  188. *
  189. *   ROUND RESULT AND CHECK
  190. *    FOR EXCEPTIONAL CONDITIONS
  191. *
  192.   LBSR    VALID        VALIDATE RESULT
  193.   LEAS 24,S  REMOVE LOCAL STORAGE
  194.   RTS
  195. *
  196.   TTL FLOATING-POINT DIVISION ROUTINE
  197.   PAG
  198. ******************************************************
  199. *
  200. *    FDIV --
  201. *     DIVIDES ARG1 BY ARG2 AND STORES QUOTIENT IN
  202. *    RESULT. RESULT SIGN IS EXCLUSIVE-OR OF THE
  203. *    ARGUMENT SIGNS. RESULT EXPONENT IS EXP1 -EXP2.
  204. *    THE RESULT FRACTION IS FORMED BY DIVIDING THE
  205. *    FRACT1 BY FRACT2 USING A MODIFIED NON-RESTORING
  206. *    BINARY DIVISION SIMILAR TO THAT IN
  207. *     GESCHWIND AND MCKLUSKEY, "DESIGN OF DIGITAL
  208. *    COMPUTERS", PP. 278 FF.
  209. *
  210. *    LOCAL STORAGE:
  211. *      FRCSIZ (0) -- NUMBER OF BYTES IN FRACTION
  212. *      FRBITS (1) -- NUMBER BITS (+ GUARD) IN FRACT.
  213. *      VBIT (2)  -- CARRY OUT OF HIGH-ORDER DIVIDEND
  214. *      RSIND (3) -- INDEX OF RESULT BYTE RECEIVING
  215. *            CURRENTLY GENERATED QUOTIENT BIT
  216. *      RSBIT (4) -- BIT MASK FOR QUOTIENT BIT BEING
  217. *            GENERATED
  218. *      BITCNT (5) -- COUNT OF QUOTIENT BITS GENERATED
  219. *
  220. FRCSIZ SET 0
  221. FRBITS SET 1
  222. VBIT   SET 2
  223. RSIND  SET 3
  224. RSBIT  SET 4
  225. BITCNT SET 5
  226. *
  227. *
  228. FDIV EQU *
  229.   LEAS -6,S    RESERVE LOCAL STORAGE
  230.   LDA RPREC,U
  231.   LSRA
  232.   LEAX FRCTAB,PCR  GET LARGEST INDEX TO FRACTION
  233.   LDB A,X
  234.   DECB           CHANGE BYTE COUNT TO INDEX
  235.   STB FRCSIZ,S
  236.   LEAX BITTBL,PCR
  237.   LDB A,X
  238.   STB FRBITS,S    STORE FRACTION BIT COUNT
  239. *
  240. *    CREATE RESULT SIGN
  241. *
  242.   LDA ARG1,U
  243.   EORA ARG2,U
  244.   STA RESULT,U
  245. *
  246. *    CREATE RESULT EXPONENT AS DIFFERENCE OF
  247. *    ARGUMENT EXPONENTS.
  248. *
  249.   LDD EXP1,U
  250.   SUBD EXP2,U
  251.   STD EXPR,U
  252. *
  253. *     DIVIDE FRACT1 BY FRACT2. THE RESULT FRACTION IS
  254. *    CLEARED AND QUOTIENT BITS ARE DIRECTLY INSERTED INTO
  255. *    THE PROPER PLACE IN THE RESULT. THE NUMBER OF BITS
  256. *    GENERATED IS THE SIGNFICANT BITS + 1 GUARD BIT +
  257. *    1 ROUND BIT (IN CASE OF POSSIBLE LEFT SHIFT). IF
  258. *    THE DIVIDEND IS NON-ZERO AT THAT POINT, THEN THE
  259. *    STICKY BYTE IS ALSO SET NON-ZERO.
  260. *
  261.   LEAX FRACT1,U
  262.   LEAY FRACT2,U
  263.   LEAU FRACTR,U
  264. *
  265.   LDA #$80   INITIAL QUOTIENT BIT MASK
  266.   STA RSBIT,S
  267.   CLRA
  268.   STA VBIT,S   NO INITIAL CARRY
  269.   STA BITCNT,S     INITIALIZE BIT COUNT
  270.   STA RSIND,S     INITIALIZE QUOTIENT BYTE TO GENERATE
  271.   WHILE A,LT,(FRBITS,S)    LOOP TO GENERATE QUOTIENT BITS
  272.     IFTST (VBIT,S),EQ,#0  IF CARRY OUT IS ZERO, COMPARE FRACTIONS
  273.       CLRA
  274.       LDB A,X
  275.       WHILE B,EQ,(A,Y)       UNLESS BYTES ARE UNEQUAL
  276.     CMPA  FRCSIZ,S       IF ALL BYTES ARE COMPARED, THEN
  277.     BGE   FDOSUB         FRACTS ARE EQUAL: DO SUBTR.
  278.     INCA          NEXT BYTE
  279.     LDB A,X       FOR COMPARISON
  280.       ENDWH
  281. *
  282. *     IF IT FELL OUT OF THE LOOP, THE THE CC REGISTER
  283. *    TELLS THE RESULT OF THE COMPARISON.
  284. *
  285.       BLO FDSHFT       UNLESS DIVISOR WAS LARGER
  286.   ENDIF      A SUBTRACTION IS REQUIRED
  287. *
  288. *     GENERATE A QUOTIENT BIT OF '1' AND SUBTRACT THE
  289. *    DIVISOR FROM THE DIVIDEND.
  290. *
  291. FDOSUB EQU *
  292.     LDA RSIND,S     GET BYTE INDEX
  293.     LDB RSBIT,S     GET BIT MASK
  294.     ORB A,U       OR '1' INTO RESULT
  295.     STB A,U
  296. *
  297.     XSBTRY      SUBTRACT DIVISOR FROM DIVIDEND
  298. *
  299. *     NOW SHIFT THE DIVIDEND FRACTION TO THE
  300. *    LEFT ONE BIT, SAVING BIT SHIFTED OUT OF THE
  301. *    MSBYTE IN 'VBIT'.  ALSO ADJUST QUOTIENT
  302. *    BIT MASK TO GENERATE THE NEXT BIT.
  303. *
  304. FDSHFT EQU *
  305.    CLRA       CLEAR CARRY
  306.    LSHIFT   0,X,9  SHIFT DIVIDEND LEFT
  307.    LDB #0
  308.    ROLB      SAVE CARRY OUT
  309.    STB VBIT,S
  310.    ROR RSBIT,S     ROTATE QUOTIENT BIT MASK
  311.    IFCC CS     UNLESS THIS BYTE NOT FINISHED
  312.      ROR RSBIT,S     ROTATE BIT INTO MSB OF MASK
  313.      INC RSIND,S       AND MOVE TO NEXT QUOTIENT BYTE
  314.    ENDIF
  315.    INC BITCNT,S     INCR. COUNT OF BITS GENERATED
  316.    LDA BITCNT,S
  317.   ENDWH      END LOOP TO GENERATE BINARY QUOTIENT
  318. *
  319. *     ALL SIGNIFICANT BITS ARE GENERATED. NOW SET THE
  320. *    STICKY BYTE TO NON-ZERO IF THE REMAINING PART OF
  321. *    THE DIVIDEND IS NON-ZERO.
  322. *
  323.   LEAU -FRACTR,U
  324.   CLRA
  325.    WHILE A,LE,(FRCSIZ,S)
  326.     IFTST (A,X),NE,0
  327.       LDA #10      IF DIVIDEND<>0, SET
  328.       STA STIKY,U  STIKY BYTE AND END LOOP
  329.     ELSE
  330.       INCA
  331.     ENDIF
  332.    ENDWH
  333. *
  334. *    NORMALIZE FRACTION ONE BIT TO LEFT, IF NEEDED.
  335. *
  336.   LEAX RESULT,U
  337.   LDA  FRACT,X
  338.   IFCC GE        IF MSBIT NOT A ONE
  339.     LBSR NORM1          NORMALIZE RESULT
  340.   ENDIF
  341. *
  342. *     FORCE AN UNDERFLOW WHEN ZERO IS GENERATED AS A RESULT,
  343. *    BY DISALLOWING A NORMAL ZERO TO PASS THROUGH.
  344. *
  345.   LDD  EXP,X      IF RESULT EXPONENT IS MINIMUM,
  346.   IF   D,EQ,#$8000
  347.     LBSR  DNORM1      FIX IT SO EXPONENT IS'NT MINIMUM
  348.   ENDIF
  349. *
  350. *     CHECK FOR EXCEPTIONS AND ROUND RESULT
  351. *
  352.   LBSR VALID     VALIDATE RESULT
  353. *
  354. *     CLEAN UP STACK AND SPLIT
  355. *
  356.   LEAS 6,S
  357.   RTS
  358.